<?php

namespace framework\support;

class Redis
{
    private static $_instance = null;
    private static  $redis = null;
    private static  $prefix = "";
    /**
     * Single constructor. 私有的构造方法
     */
    private function __construct()
    {;
    }

    /**
     * @purpose: 创建__clone方法防止对象被复制克隆
     */
    private function __clone()
    {
        // E_USER_ERROR只能通过trigger_error($msg, E_USER_ERROR)手动触发。
        // E_USER_ERROR是用户自定义错误类型，可以被set_error_handler错误处理函数捕获，允许程序继续运行。
        // E_ERROR是系统错误，不能被set_error_handler错误处理函数捕获，程序会退出运行
        trigger_error('Clone is not allow!', E_USER_ERROR);
    }


    /**
     * @return Single|Object 单例方法,用于访问实例的公共的静态方法
     */
    public static function getInstance()
    {
        if (!self::$_instance) {
            self::$_instance = new self;
            $host = $_ENV['REDIS_HOST'] ?? null;
            $port = $_ENV['DREDIS_PORT'] ?? '6379';
            $db = $_ENV['DREDIS_DB'] ?? 0;
            self::$prefix = $_ENV['REDIS_PREFIX'] ?? '';
            if ($host) {
                try {
                    self::$redis = new \Redis();
                    self::$redis->connect($host, $port);
                    self::$redis->select($db);
                } catch (\RedisException $e) {
                    echo  $e->getMessage();
                    return throw new \Exception("数据库连接失败");
                }
            }
        }
        return self::$_instance;
    }

    public static function getRedis()
    {
        return self::$redis;
    }

    //当请求不存在的方法时执行
    public static function __callStatic($name, $arguments)
    {

        // 检查 Redis 实例是否为 null，如果是则调用 getInstance 方法进行初始化
        if (self::$redis === null) {
            self::getInstance();
        }

        // 再次检查 Redis 实例是否为 null 并且要调用的方法是否存在
        if (self::$redis !== null && method_exists(self::$redis, $name)) {
            return self::$redis->$name(...$arguments);
        } else {
            // 如果方法不存在，抛出异常
            throw new \Exception("Method {$name} not found");
        }
    }
}
